#ifndef _VL_RTSP_RTP__H_
#define _VL_RTSP_RTP__H_

#include "defs.h"
#include "utils/buffer.h"

namespace VLRTSP {

/**
 * @Author: CimZzz
 * @Date: 2022-01-10 11:39:51
 * 
 * RTP 头部长度
 */
#define RTP_HEADER_LENGTH 12

/**
 * @Author: CimZzz
 * @Date: 2022-01-14 15:10:04
 * 
 * RTP TCP 头部长度
 */
#define RTP_TCP_HEAD_LENGTH 4


/**
 * @Author: CimZzz
 * @Date: 2022-01-10 11:40:23
 * 
 * RTP 帧最大尺寸
 */
#define MAX_RTP_PAYLOAD_LENGTH 1420

/**
 * @Author: CimZzz
 * @Date: 2022-01-10 11:42:20
 * 
 * RTP 帧缓存长度
 */
#define RTP_FRAME_BUFFER_LENGTH 1600

/**
 * @Author: CimZzz
 * @Date: 2022-01-10 11:40:52
 * 
 * RTP 版本号
 */
#define RTP_VERSION 2

/**
 * @Author: CimZzz
 * @Date: 2022-01-10 15:59:20
 * 
 * 载荷类型
 * 通常赋值给 [RTPHeader.payload]，表示数据载荷类型
 */
enum PayloadType {
	// 未知
	SourceType_Unknown  = -1,
	// AAC
	SourceType_AAC  = 8,
	// H264
	SourceType_H264 = 96
};



/**
 * @Author: CimZzz
 * @Date: 2022-01-13 17:57:12
 * 
 * 传输模式
 */
enum TransportMode {
	// TCP
	Transport_TCP,
	// UDP
	Transport_UDP,
	// 组播
	Transport_MULTICAST,
	// 无传输模式
	Transport_NONE,
};

/**
 * @Author: CimZzz
 * @Date: 2022-01-10 11:32:55
 * 
 * RTP 头部
 */
struct RTPHeader {
#if VL_RTSP_BIGENDIAN
	// 大端字节序
	uint8_t version   : 2;
	uint8_t padding   : 1;
	uint8_t extension : 1;
	uint8_t csrc      : 4;
	uint8_t marker    : 1;
	uint8_t payload   : 7;
#else
	// 小端字节序
	uint8_t csrc      : 4;
	uint8_t extension : 1;
	uint8_t padding   : 1;
	uint8_t version   : 2;
	uint8_t payload   : 7;
	uint8_t marker    : 1;
#endif
	uint16_t seq;
	uint32_t timestamp;
	uint32_t ssrc;
};

/**
 * @Author: CimZzz
 * @Date: 2022-01-10 11:38:51
 * 
 * RTP 帧
 * 包含 RTP 头部
 */
struct RTPFrame {
	/* data */
	RTPFrame(): buffer(new Buffer(RTP_FRAME_BUFFER_LENGTH)) {
	}

	std::shared_ptr<Buffer> buffer;
};



}


#endif //_VL_RTSP_RTP__H_
